﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LM.InterfacesFabricas.Interfaces.Repositorios;
using LM.Negocio.Objetos;

namespace LM.Negocio.Validadores
{
    public class ValidadorDeTelefone :  ValidadorAbastrato
    {
         private Telefone _objetoValidado;

        private IRepositorioDeConsultaDeObjetos<Telefone> _repositorioDeTelefone;

        public ValidadorDeTelefone( IRepositorioDeConsultaDeObjetos<Telefone> repositorioDeTelefone )
        {
            if ( repositorioDeTelefone == null )
            {
                throw new ArgumentNullException( "repositorioDeTelefone" );
            }

            _repositorioDeTelefone = repositorioDeTelefone;
        }

        public void ValideCadastro( Telefone telefone )
        {
            if ( telefone == null )
            {
                throw new ArgumentException( "telefone" );
            }

            _objetoValidado = telefone;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideDddNaoInformada();
            ValideNumeroNaoInformado();
            ValideTelefoneJaCadastrada();

            base.GarantaSucesso();
        }

        public void ValideAtualizacao( Telefone telefone )
        {
            if ( telefone == null )
            {
                throw new ArgumentException( "telefone" );
            }

            _objetoValidado = telefone;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideDddNaoInformada();
            ValideNumeroNaoInformado();
            ValideTelefoneJaCadastrada();

            base.GarantaSucesso();
        }

        public void ValideExclusao( Telefone telefone )
        {
            if ( telefone == null )
            {
                throw new ArgumentException( "telefone" );
            }

            _objetoValidado = telefone;
            base.LimpeInconsistencias();

            ValideTelefoneNaoCadastrada();

            base.GarantaSucesso();
        }

        private void ValideCodigoNaoInformado()
        {
            if ( _objetoValidado.Codigo == 0 )
            {
                AdicioneInconsistencia( "Código não informado." );
            }
        }

        private void ValideDddNaoInformada()
        {
            if ( _objetoValidado.Ddd ==0 )
            {
                AdicioneInconsistencia( "Ddd não informada." );
            }
        }

        private void ValideNumeroNaoInformado()
        {
            if ( _objetoValidado.Numero == 0)
            {
                AdicioneInconsistencia( "Ddd não informada." );
            }
        }

        private bool TelefoneJaCadastrada()
        {
            return _repositorioDeTelefone.Consulte( m => m.Codigo == _objetoValidado.Codigo ).Any();
        }

        private void ValideTelefoneJaCadastrada()
        {
            if ( TelefoneJaCadastrada() )
            {
                AdicioneInconsistencia( "Já existe um Telefone cadastrada com o código {0}.", _objetoValidado.Codigo );
            }
        }

        private void ValideTelefoneNaoCadastrada()
        {
            if ( !TelefoneJaCadastrada() )
            {
                AdicioneInconsistencia( "Telefone com o código {0} não cadastrada.", _objetoValidado.Codigo );
            }
        }
    }
}
